package com.sf.ams.biz.impl;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.springframework.stereotype.Service;

import com.sf.ams.biz.IString2SqlParserBiz;
import com.sf.ams.constant.Constant;
import com.sf.ams.exception.AmsException;
import com.sf.ams.wordcount.DelimiterWordCount;

/**
 * 描述：文件内容解析成SQL脚本
 * 
 * <pre>HISTORY
 * ****************************************************************************
 *  ID   DATE           PERSON          REASON
 *  1    2017年12月7日      Simba.Hua         Create
 * ****************************************************************************
 * </pre>
 * @author Simba.Hua
 */
@Service("string2SqlProcessBiz")
public class String2SqlParserBizImpl implements IString2SqlParserBiz{

	@Override
	public List<String> parse(String fileContent) {
		int dellimiterCount = getDellimiterCount(fileContent);
		if (dellimiterCount == 0) {
			return Arrays.asList(fileContent.split(Constant.SQL_SPLIT));
		}
		if (dellimiterCount % 2 != 0) {
			throw new AmsException("SQL文件异常，关键字DELIMITER不配对");
		}
		List<String> lineContents = Arrays.asList(fileContent.split(Constant.SEQUENCE_SPLIT));
		StringBuilder sb = new StringBuilder();
		List<String> sqlResult = new ArrayList<>();
		for (String lineContent : lineContents) {
			List<String> words = Arrays.asList(lineContent.toUpperCase().split(Constant.WORD_SPLIT));
			if (dellimiterCount % 2 == 0) {//如果这个是偶数，则不是 在处理存储过程或者函数
				if (words.contains(Constant.DELIMITER)) {
					dellimiterCount --;
					sb.append(lineContent).append(Constant.SEQUENCE_SPLIT);
				} else {
					parseSimpleSql(sqlResult,lineContent, sb);
				}
			} else {//正在处理函数或存储过程
					sb.append(lineContent).append(Constant.SEQUENCE_SPLIT);
				if (words.contains(Constant.DELIMITER)) {//说明这一行中有DELIMITER关键字
					//程序执行到这里，说明碰到了结束的DELIMITER，则这个存储过程应该要结束了
					sqlResult.add(produceKeyFilter(sb.toString()));//说明一个存储过程已经结束
					sb.delete(0, sb.length());
					dellimiterCount --;
				} 
			}
			
		}
		return sqlResult;
	}
	
	private void parseSimpleSql(List<String> sqlResult,String lineContent,StringBuilder sb) {
		if (lineContent.contains(Constant.SQL_SPLIT)) {
			List<String> simpleSql = Arrays.asList(lineContent.split(Constant.SQL_SPLIT));
			for (String endSql : simpleSql) {
				sb.append(endSql).append(Constant.SQL_SPLIT);
				sqlResult.add(sb.toString());
				sb.delete(0, sb.length());
			}
		} else {
			sb.append(lineContent).append(Constant.SEQUENCE_SPLIT);
		}
	}
	private String produceKeyFilter(String sql) {
		return sql.replaceAll("(?i)" + Constant.DELIMITER, "")
		.replaceAll("//", "")
		.replaceAll("$$", "");
	}
	private int getDellimiterCount(String fileContent) {
		return DelimiterWordCount.getInstance().count(fileContent);
	}

}
